import {defineStore} from 'pinia';
import type {FileTask} from "../models/task.ts";
import {TaskStatus} from "../models/task.ts";


// 定义 state 类型
interface TaskStoreState {
    taskList: FileTask[];
    receiveList: FileTask[];
}

// 定义一个 name 为‘blogStore’的 store
export const useTaskStore = defineStore('taskStore', {
    // 第三方插件的持久化配置
    persist: {
        enabled: true,
        strategies: [{
            storage: sessionStorage
        }]
    },
    state: (): TaskStoreState => {
        return {
            taskList: [], // 任务列表数据
            receiveList: [],
        };
    },
    getters: {
        getTaskList(state): any[] {
            return state.taskList;
        },
        getReceiveList(state): any[] {
            return state.receiveList;
        },
        getActiveTaskList(state): any[] {
            return state.taskList.filter(e => {
                return [TaskStatus.CREATED, TaskStatus.RUNNING, TaskStatus.SUSPEND].includes(e.status);
            });
        },
        getCompletedTaskList(state): any[] {
            return state.taskList.filter(e => e.status == TaskStatus.COMPLETE);
        },
    },
    actions: {
        /**
         * 根据Id，查询receiveTask
         * @returns {Promise<*>}
         * @param id
         */
        getReceiveTaskById(id: string) {
            if (!id) {
                new Error("id不能为空");
            }
            return this.receiveList.find(e => {
                return String(e.id) === String(id)
            })
        }
        /**
         * 根据Id，查询task
         * @returns {Promise<*>}
         * @param id
         */
        ,getTaskById(id: string) {
            if (!id) {
                new Error("id不能为空");
            }
            return this.taskList.find(e => {
                return String(e.id) === String(id)
            })
        }

        , getTaskByFileName(name: string) {
            if (!name) {
                new Error("name 不能为空");
            }

            return this.taskList.find(e => {
                return String(e.fileName) === String(name)
            })
        }

        /**
         * 添加到列表
         * @return true表示添加成功，false表示已经存在了，不再添加
         */
        , addToTaskList(task: FileTask): boolean {
            //文件要去重复
            if (!this.getTaskById(task.id)) {
                this.taskList.unshift(task); //添加到数组首
                return true;
            } else {
                return false;
            }
        }

        /**
         * 添加到列表
         * @return true表示添加成功
         */
        , addToReceiveList(task: FileTask): boolean {
            this.receiveList.unshift(task); //添加到数组首
            return true;
        }

        /**
         * 刷新进度
         * @return true表示添加成功
         */
        , updateProgress(taskId:string,taskFile:string,taskProgressValue:number,isReceive:boolean){
            if (isReceive) {
                let task = this.getReceiveTaskById(taskId)
                if (!task) {
                    console.error(`接收任务列表中找不到此任务. id=${taskId}, file=${taskFile} `)
                }
                if (task.fileName!=taskFile) {
                    console.error(`接收任务列表中 此任务${taskId} 的file对不上. expect file=${task.fileName}, actual file=${taskFile} `)
                }
                task.processValue = Math.floor(taskProgressValue * 100);
                if (task.processValue>=100) {
                    task.status = TaskStatus.COMPLETE;
                }
            } else {
                let task = this.getTaskById(taskId)
                if (!task) {
                    console.error(`发送任务列表中找不到此任务. id=${taskId}, file=${taskFile} `)
                }
                if (task.fileName!=taskFile) {
                    console.error(`发送任务列表中 此任务${taskId} 的file对不上. expect file=${task.fileName}, actual file=${taskFile} `)
                }
                task.processValue = Math.floor(taskProgressValue * 100);
                if (task.processValue>=100) {
                    task.status = TaskStatus.COMPLETE;
                }
            }
        }
    }
});